package msystem

import (
	"fmt"
	"gitee.com/dennis-mxx/mxx-core/mexception"
	"github.com/spf13/viper"
)

var MysqlDataSource *MysqlOptions
var SqlIte3DataSource *SqlIte3Options
var Redis *RedisOptions
var Log *LogOptions
var Iris *IrisOptions
var Environment string
var Storage *viper.Viper

func InitSystem(environment string) {
	config := ConfigOptions{}
	env := EnvOptions{}
	var resource *viper.Viper
	resource = viper.New()

	resource.SetConfigType("properties")
	resource.AddConfigPath("./conf")
	if environment == "" {
		resource.SetConfigName("application")

		resource.MergeInConfig()
		resource.Unmarshal(&env)
		if env.Env == "" {
			panic(mexception.NewException(mexception.ValidationException, "application.properties [env]  cannot be empty"))
		}
	} else {
		env.Env = environment
	}

	resource.SetConfigName(fmt.Sprintf("application-%s", env.Env))
	resource.MergeInConfig()
	if err := resource.Unmarshal(&config); err != nil {
		panic(mexception.NewException(mexception.ERROR, fmt.Sprintf("application-%s.properties Failed to read. Please check whether the file exists", env.Env)))
	}
	l := resource.Get("sqlite")
	fmt.Println(l)

	MysqlDataSource = &config.Mysql
	SqlIte3DataSource = &config.Sqlite
	Iris = &config.Iris
	Log = &config.Log
	Redis = &config.Redis
	Environment = env.Env
	Storage = resource
	if Redis.DialTimeout == 0 {
		Redis.DialTimeout = 10
	}
	if Redis.ReadTimeout == 0 {
		Redis.ReadTimeout = 10
	}
}

type EnvOptions struct {
	Env string `json:"env"`
}

type ConfigOptions struct {
	Mysql   MysqlOptions           `json:"mysql"`
	Sqlite  SqlIte3Options         `json:"sqlite3"`
	Iris    IrisOptions            `json:"iris"`
	Log     LogOptions             `json:"log"`
	Redis   RedisOptions           `json:"redis"`
	Storage map[string]interface{} `json:"storage"`
}
type LogOptions struct {
	Level string `json:"level"`
}
type RedisOptions struct {
	Network     string
	Addr        string
	Password    string
	DB          int
	ReadTimeout int
	DialTimeout int
}

type IrisOptions struct {
	FileStoragePath string // 文件存储位置
	FileMaxSize     int64  // 文件最大大小
	Port            int    `json:"port"`             // 端口号
	ApplicationName string `json:"application_name"` // web服务名称
	ContextPath     string `json:"context_path"`     // 请求根路径
}
type MysqlOptions struct {
	Username    string `json:"username"`      // 用户名
	Password    string `json:"password"`      // 密码
	Host        string `json:"host"`          // 地址
	Database    string `json:"mysql"`         // 数据库名
	Port        int    `json:"port"`          // 端口
	ShowSql     bool   `json:"show_sql"`      // 打印sql
	MaxIdleConn int    `json:"max_idle_conn"` // 最大闲置链接数
	MaxOpenConn int    `json:"max_open_conn"` // 最大活跃连接数
	Timeout     int64  `json:"timeout"`       // 请求超时时间（单位毫秒）
	InitSql     int64  `json:"init_sql"`      // 初始化SQL
}
type SqlIte3Options struct {
	DataSourceAddr string `json:"data_source_addr"` // 数据源地址
	InitSql        int64  `json:"init_sql"`         // 初始化SQL
	ShowSql        bool   `json:"show_sql"`         // 打印sql
	MaxIdleConn    int    `json:"max_idle_conn"`    // 最大闲置链接数
	MaxOpenConn    int    `json:"max_open_conn"`    // 最大活跃连接数
	Timeout        int64  `json:"timeout"`          // 请求超时时间（单位毫秒）
}
